#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <sstream>

#define forn(i,n) for(i=0; i < (int)(n); ++i)

using namespace std;

string doubletostring(double value) {
  std::ostringstream o;
  if (!(o << value))
    return "";
  return o.str();
}

string dameChocloParametros(const vector< string > &params, const vector< float > &valores) {
	int i;
	string res = "";
	forn(i,params.size()) {
		float valor = valores[i];
		res += (params[i] + "=" +doubletostring(valor)+" ");
	}
	return res;
}

int main(int argc, char* argv[]) {
	/*valores busqueda*/
	float limiteInferior = -10;
	float limiteSuperior = 10;
	float delta = 1;
	
	/*Puntajes*/
	int puntJug0;
	int puntJug1;
	
	/*Para calculo*/
//	int cantPartidas = 1;
	int repeticiones = 1;
	int r;
	int tamTablero = 11;
//	int c;
	int victorias = 0;
	
	/*archivo*/
	ifstream archRes;
	
	/*Parametros*/
	int p = 0;
	vector< string > params;
	string parametros;
	
	params.push_back("-p_cip");
	params.push_back("-p_cie");
	params.push_back("-p_tip");
	params.push_back("-p_tie");
	params.push_back("-p_fep");
	params.push_back("-p_fee");
	
	int cantParamMirar = params.size();
	int cantCorridas=0;
	vector< float > valores = vector< float >(params.size(),1);
	vector< float > finales = vector< float >(params.size(),1);
	
	/*Jugadores*/
	string jugador1 = "./jugadores/heurb", jugador0 = "./nuestros_jugadores/mike ";
	int limite = (limiteSuperior - limiteInferior ) / delta;
	vector< vector<int> > resultados = vector< vector<int> > (cantParamMirar,vector<int> (limite , -100));
	forn(cantCorridas,1){

//		forn(p,cantParamMirar ){
		forn(p,cantParamMirar ){
			forn (r, repeticiones) {
				valores[p] = limiteInferior;
				int count = 0;
				while(valores[p] < limiteSuperior) {
					cout << "Parametros: " << dameChocloParametros(params,valores) << endl;
					victorias = 0;
					parametros = "./judge " + doubletostring(tamTablero) + " " + jugador0 + dameChocloParametros(params,valores) + " -- " + jugador1 + " > result.txt";
					system(parametros.c_str());
					archRes.open("result.txt", ifstream::in);
					archRes >> puntJug0 >> puntJug1;
					cout << "\tPartido -- " << "jug0: "<< puntJug0<< "|\t jug1: "<< puntJug1 << endl;
					if(puntJug0 > puntJug1) victorias++;
					archRes.close();
					
					resultados[p][count] += victorias;
					cout << count << " " << valores[p] << endl;
					valores[p] += delta;
					count++;
				}
			}

			int final = 0;
			for (int i = 0; i < (int)resultados[p].size(); i++) {
				//cout << i << " " << resultados[i] << endl;
				if (resultados[p][i]>resultados[p][final]) final = i;
			}

//			float ffinal = ((float)final)/10;
			float ffinal = ((float)final);
			cout << ffinal << endl;
			
			valores[p] = ffinal;
			p++;
		}
	}
	cout << "Parametros: " << dameChocloParametros(params,valores) << endl;
	
	return 0;
}
